﻿// Inner Fire 游戏引擎库
// Material - 材质
//
// Copyright (c) 2025 by 尔西大帝. All rights reserved.
//
// 所属层级：应用层(4)
// 材质的资源。
//
// Author: 尔西大帝
// Email: 2670613871@qq.com
// Created: 2025-01-14

#pragma once

#include <dx/mesh/render_item.h>
#include <dx/texture/dx_material.h>
#include <game/resource/resource.h>
#include <xml_reader.h>

using namespace ikit;

namespace ifire::game {
class Assets;

// 材质的类型，目前用来决定分在哪个层里面？
enum class MaterialType {
  Normal = 0,   // 普通Diffuse材质
  Hollow,       // 镂空材质
  Alpha,        // 使用图片的Alpha做为混合
  Transparency, // 透明材质（直接混合）
  Count
};

class Material : public Resource {
public:
  Material(Assets* manager, const XmlNode& node);
  Material(const Material& lhs) = delete;
  Material& operator=(const Material& lhs) = delete;
  ~Material() = default;

  // 根据类型选择所在的层
  dx::RenderLayer GetRenderLayer() const;

  // 这个没有实际意义，只是为了匹配泛型
  void Ready() {}

  //
  // 属性访问
  //
  void SetMaterial(dx::Material* material) { material_ = material; }
  dx::Material* GetMaterial() { return material_; }

  // 根据名称获得Material类型
  static MaterialType ReadType(ikit::sstr name);

public:
  // 材质的类型
  MaterialType type;
  // 贴图名称
  ikit::sstr albedo;
  // 法线贴图的名称
  ikit::sstr normal;
  // 着色，也可以视为default diffuse color
  XMFLOAT4 tint = {1.0f, 1.0f, 1.0f, 1.0f};
  // 用于镜面光的计算
  XMFLOAT3 fresnel_r0 = {0.01f, 0.01f, 0.01f};
  // 粗糙度
  float roughness = 0.0f;

private:
  // 对于渲染器中的引用
  dx::Material* material_ = nullptr;
};

using MaterialPtr = std::unique_ptr<Material>;

} // namespace ifire::game